"""
    1. sift算法实例化
        cv.xfeatures2d.SIFT_create()
    2. 利用sift.detectAndCompute()检测关键点并计算
        kp, des = sift.detectAndCompute(gray, None)
            参数：gray：进行关键点检测的图像，注意是灰度图像
            返回：kp:关键点信息，包括位置，尺度，方向信息， des:关键点描述符，每个关键点对应128个梯度信息的特征向量
    3. 将关键点检测结果绘制在图像上
        cv.drawKeypoints(image, keypoint, outputimage, color, flags)
            参数：
                image:原始图像
                keypoints：关键点信息，将其绘制在图像上
                outputimage:输出图片，可以是原始图像
                color:颜色设置，通过修改（b, g, r)的值，更改画笔的颜色，b = 蓝色， g = 绿色， r = 红色
                flags:绘图功能的表示设置
                    1. cv.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵，使用现存的输出图像绘制匹配对和特征点，对每一个关键点只绘制中间点
                    2. cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵，而是在输出图像上绘制匹配对
                    3. cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINT：对每一个特征点绘制带大小和方向的关键点图形
                    4. cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:单点的特征点不被绘制

"""
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 1. 读取图像，并转换成灰度图像
img = cv.imread("image/tv.jpg")
gray = cv.cvtColor(img, cv.COLOR_BGRA2GRAY)

# 2. sift关键点检测
# 2.1 实例化sift对象
sift = cv.SIFT_create()

# 2.2 关键点检测：kp关键点信息包括方向、尺度、位置信息，des是关键点的描述符
kp, des = sift.detectAndCompute(gray, None)
# 2.3 在图像上绘制关键点的检测结果
cv.drawKeypoints(img, kp, img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 3. 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title("sift检测")
plt.xticks([]), plt.yticks([])
plt.show()




